{
 "cells": [
  {
   "cell_type": "raw",
   "metadata": {},
   "source": [
    "好坏质检分类实战task：\n",
    "1、基于data_class_raw.csv数据，根据高斯分布概率密度函数，寻找异常点并剔除\n",
    "2、基于data_class_processed.csv数据，进行PCA处理，确定重要数据维度及成分\n",
    "3、完成数据分离，数据分离参数：random_state=4,test_size=0.4\n",
    "4、建立KNN模型完成分类，n_neighbors取10，计算分类准确率，可视化分类边界\n",
    "5、计算测试数据集对应的混淆矩阵，计算准确率、召回率、特异度、精确率、F1分数\n",
    "6、尝试不同的n_neighbors（1-20）,计算其在训练数据集、测试数据集上的准确率并作图"
   ]
  },
  {
   "cell_type": "raw",
   "metadata": {},
   "source": [
    "@Author  : Flare Zhao\n",
    "@Email: 454209979@qq.com\n",
    "@QQ讨论群：530533630  申请加群的验证信息为订单号（粘贴号码数字即可）\n",
    "@如果觉得课程不错的话，欢迎推荐朋友学习，发送朋友截图（含报名日期）和订单号至老师邮箱，返还100元学费"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>x1</th>\n",
       "      <th>x2</th>\n",
       "      <th>y</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>0.77</td>\n",
       "      <td>3.97</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>1.71</td>\n",
       "      <td>2.81</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>2.18</td>\n",
       "      <td>1.31</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>3.80</td>\n",
       "      <td>0.69</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>5.21</td>\n",
       "      <td>1.14</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "     x1    x2  y\n",
       "0  0.77  3.97  0\n",
       "1  1.71  2.81  0\n",
       "2  2.18  1.31  0\n",
       "3  3.80  0.69  0\n",
       "4  5.21  1.14  0"
      ]
     },
     "execution_count": 1,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#load the data\n",
    "import pandas as pd\n",
    "import numpy as np\n",
    "data = pd.read_csv('data_class_raw.csv')\n",
    "data.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "#define X and y\n",
    "X = data.drop(['y'],axis=1)\n",
    "y = data.loc[:,'y']"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 360x360 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "#visualize the data\n",
    "%matplotlib inline\n",
    "from matplotlib import pyplot as plt\n",
    "fig1 = plt.figure(figsize=(5,5))\n",
    "bad = plt.scatter(X.loc[:,'x1'][y==0],X.loc[:,'x2'][y==0])\n",
    "good = plt.scatter(X.loc[:,'x1'][y==1],X.loc[:,'x2'][y==1])\n",
    "plt.legend((good,bad),('good','bad'))\n",
    "plt.title('raw data')\n",
    "plt.xlabel('x1')\n",
    "plt.ylabel('x2')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[ 1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1 -1]\n"
     ]
    }
   ],
   "source": [
    "#anomay detection\n",
    "from sklearn.covariance import EllipticEnvelope\n",
    "ad_model = EllipticEnvelope(contamination=0.02)\n",
    "ad_model.fit(X[y==0])\n",
    "y_predict_bad = ad_model.predict(X[y==0])\n",
    "print(y_predict_bad)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 360x360 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "fig2 = plt.figure(figsize=(5,5))\n",
    "bad = plt.scatter(X.loc[:,'x1'][y==0],X.loc[:,'x2'][y==0])\n",
    "good = plt.scatter(X.loc[:,'x1'][y==1],X.loc[:,'x2'][y==1])\n",
    "plt.scatter(X.loc[:,'x1'][y==0][y_predict_bad==-1],X.loc[:,'x2'][y==0][y_predict_bad==-1],marker='x',s=150)\n",
    "plt.legend((good,bad),('good','bad'))\n",
    "plt.title('raw data')\n",
    "plt.xlabel('x1')\n",
    "plt.ylabel('x2')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [],
   "source": [
    "data = pd.read_csv('data_class_processed.csv')\n",
    "data.head()\n",
    "#define X and y\n",
    "X = data.drop(['y'],axis=1)\n",
    "y = data.loc[:,'y']"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[0.5369408 0.4630592]\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 360x360 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "#pca \n",
    "from sklearn.preprocessing import StandardScaler\n",
    "from sklearn.decomposition import PCA\n",
    "X_norm = StandardScaler().fit_transform(X)\n",
    "pca = PCA(n_components=2)\n",
    "X_reduced = pca.fit_transform(X_norm)\n",
    "var_ratio = pca.explained_variance_ratio_\n",
    "print(var_ratio)\n",
    "fig4 = plt.figure(figsize=(5,5))\n",
    "plt.bar([1,2],var_ratio)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(21, 2) (14, 2) (35, 2)\n"
     ]
    }
   ],
   "source": [
    "# train and test split: random_state=4,test_size=0.4\n",
    "from sklearn.model_selection import train_test_split\n",
    "X_train, X_test, y_train, y_test = train_test_split(X,y,random_state=4,test_size=0.4)\n",
    "print(X_train.shape,X_test.shape,X.shape)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "trianing accuracy: 0.9047619047619048\n",
      "testing accuracy: 0.6428571428571429\n"
     ]
    }
   ],
   "source": [
    "#knn model\n",
    "from sklearn.neighbors import KNeighborsClassifier\n",
    "knn_10 = KNeighborsClassifier(n_neighbors=10)\n",
    "knn_10.fit(X_train,y_train)\n",
    "y_train_predict = knn_10.predict(X_train)\n",
    "y_test_predict = knn_10.predict(X_test)\n",
    "\n",
    "#calculate the accuracy\n",
    "from sklearn.metrics import accuracy_score\n",
    "accuracy_train = accuracy_score(y_train,y_train_predict)\n",
    "accuracy_test = accuracy_score(y_test,y_test_predict)\n",
    "print(\"trianing accuracy:\",accuracy_train)\n",
    "print('testing accuracy:',accuracy_test)\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(200, 200)\n"
     ]
    }
   ],
   "source": [
    "#visualize the knn result and boundary\n",
    "xx, yy = np.meshgrid(np.arange(0,10,0.05),np.arange(0,10,0.05))\n",
    "print(yy.shape)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(40000, 2)\n"
     ]
    }
   ],
   "source": [
    "x_range = np.c_[xx.ravel(),yy.ravel()]\n",
    "print(x_range.shape)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [],
   "source": [
    "y_range_predict = knn_10.predict(x_range)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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xRdr586dklTw+OrVq3XyySfrLW95i77xjW+Muaak0HgBAIBhdT76qNo++Sllt26VQlB261a1ffJTY2q+Vq1ape9///tas2aNli5duv9ezB/84Af1xS9+UevWrdPcuXP1mc985qDHP/ShD+n222/XM888M/YvNEE0XgAAYFjbvvo1hSHjEkJ3t7Z99Wujfs4VK1booosuUn19vSZOnKh3vetdevXVV9XR0aGzzjpLknTllVfqqaeeUmdn52Ed/8AHPjDqepJG4wUAAIaVbWsb0fHDEUIY9ecOfI5yHYlB4wUAAIaVmTZtRMcPR0tLix599FF1d3frlVde0bJlyzR+/HhNnjxZv/jFLyRJ3/72t3XWWWepsbFx2ONNTU1qbGzUihUrJEn333//qOtJGrcMAgAAw5r60Y+o7ZOfGnS60erqNPWjHxn1c5522mm68MILdfLJJ+uYY47RggUL1NjYqPvuu0/XXnuturq6dNxxx+mee+6RpILH77nnHn34wx9WQ0ODFi5cOLYvNEFWjC2/UluwYEHIh+8AAMDobdiwQSeeeOJhP77z0Ue17atfU7atTZlp0zT1ox9R47veNaYaXnnlFU2YMEFdXV0688wzdeedd+qUU04Z03N6Ge7P08xWhxAWDPd4drwAAEBBje9615gbraGuueYarV+/Xt3d3bryyivLtukaDRovAACQqO9+97veJbghXA8AAJCQkjVeZna3mW0zs38bcOwIM3vczJ7v///kUr0+AABA2pRyx+teSe8ccuxmST8NIRwv6af9vwcAAIhCyRqvEMJTkl4ecvgiSff1//o+Se8u1esDAACkTdLh+qNCCG2SFEJoM7OphR5oZtdIukaSXve615W0qB+s2aIvLX9OWzr2qNpMvSGoqb5GZtLOrp6SH+vo6lFjgq83mrrO7P6ZPl77sI7Sdll9/xniPS9LVi2FXqn+COdjOyXqoi7qoq6KqbWEdZ35TWlr/1wuq+77f+jVfoc6NprPGXJs4+836YIrF+nfnny4eJ97qOeprpUmTpMajpCnks7xMrPZkn4UQjip//cdIYSmAR/fGUI4ZM6rlHO8frBmiz6+9Fnt6ek99IMjdWHVCt1ac5cabJ93KQCAMdqw8CGdeEzBfY9EbNy09bXmKcHPlVVJjbOK2nylfY7XS2Y2rX+3a5qkbQm//gG+tPw5mq5DuCnz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\n",
      "text/plain": [
       "<Figure size 720x720 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "fig4 = plt.figure(figsize=(10,10))\n",
    "knn_bad = plt.scatter(x_range[:,0][y_range_predict==0],x_range[:,1][y_range_predict==0])\n",
    "knn_good = plt.scatter(x_range[:,0][y_range_predict==1],x_range[:,1][y_range_predict==1])\n",
    "\n",
    "\n",
    "\n",
    "bad = plt.scatter(X.loc[:,'x1'][y==0],X.loc[:,'x2'][y==0])\n",
    "good = plt.scatter(X.loc[:,'x1'][y==1],X.loc[:,'x2'][y==1])\n",
    "plt.legend((good,bad,knn_good,knn_bad),('good','bad','knn_good','knn_bad'))\n",
    "plt.title('prediction result')\n",
    "plt.xlabel('x1')\n",
    "plt.ylabel('x2')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[[4 2]\n",
      " [3 5]]\n"
     ]
    }
   ],
   "source": [
    "from sklearn.metrics import confusion_matrix\n",
    "cm = confusion_matrix(y_test,y_test_predict)\n",
    "print(cm)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "![confusion_matrix](images/06_confusion_matrix.png)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "5 4 2 3\n"
     ]
    }
   ],
   "source": [
    "TP = cm[1,1]\n",
    "TN = cm[0,0]\n",
    "FP = cm[0,1]\n",
    "FN = cm[1,0]\n",
    "print(TP,TN,FP,FN)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**准确率:** 整体样本中，预测正确样本数的比例\n",
    "- Accuracy = (TP + TN)/(TP + TN + FP + FN)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0.6428571428571429\n"
     ]
    }
   ],
   "source": [
    "accuracy = (TP + TN)/(TP + TN + FP + FN)\n",
    "print(accuracy)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**灵敏度（召回率）:** 正样本中，预测正确的比例\n",
    "- Sensitivity = Recall = TP/(TP + FN)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0.625\n"
     ]
    }
   ],
   "source": [
    "recall = TP/(TP + FN)\n",
    "print(recall)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**特异度:** 负样本中，预测正确的比例\n",
    "- Specificity = TN/(TN + FP)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0.6666666666666666\n"
     ]
    }
   ],
   "source": [
    "specificity = TN/(TN + FP)\n",
    "print(specificity)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**精确率:** 预测结果为正的样本中，预测正确的比例\n",
    "- Precision = TP/(TP + FP)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0.7142857142857143\n"
     ]
    }
   ],
   "source": [
    "precision = TP/(TP + FP)\n",
    "print(precision)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**F1分数:** 综合Precision和Recall的一个判断指标\n",
    "- F1 Score = 2*Precision X Recall/(Precision + Recall)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0.6666666666666666\n"
     ]
    }
   ],
   "source": [
    "f1 = 2*precision*recall/(precision+recall)\n",
    "print(f1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[1.0, 1.0, 1.0, 1.0, 1.0, 0.9523809523809523, 0.9523809523809523, 0.9523809523809523, 0.9047619047619048, 0.9047619047619048, 0.9047619047619048, 0.9523809523809523, 0.9047619047619048, 0.9047619047619048, 0.9523809523809523, 0.9047619047619048, 0.9047619047619048, 0.5714285714285714, 0.5714285714285714, 0.5714285714285714] [0.5714285714285714, 0.5, 0.5, 0.5714285714285714, 0.7142857142857143, 0.5714285714285714, 0.5714285714285714, 0.5714285714285714, 0.6428571428571429, 0.6428571428571429, 0.6428571428571429, 0.5714285714285714, 0.6428571428571429, 0.6428571428571429, 0.5714285714285714, 0.5714285714285714, 0.5714285714285714, 0.42857142857142855, 0.42857142857142855, 0.42857142857142855]\n"
     ]
    }
   ],
   "source": [
    "#try different k and calcualte the accuracy for each\n",
    "n = [i for i in range(1,21)]\n",
    "accuracy_train = []\n",
    "accuracy_test = []\n",
    "for i in n:\n",
    "    knn = KNeighborsClassifier(n_neighbors=i)\n",
    "    knn.fit(X_train,y_train)\n",
    "    y_train_predict = knn.predict(X_train)\n",
    "    y_test_predict = knn.predict(X_test)\n",
    "    accuracy_train_i = accuracy_score(y_train,y_train_predict)\n",
    "    accuracy_test_i = accuracy_score(y_test,y_test_predict)\n",
    "    accuracy_train.append(accuracy_train_i)\n",
    "    accuracy_test.append(accuracy_test_i)\n",
    "print(accuracy_train,accuracy_test)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 864x360 with 2 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "fig5 = plt.figure(figsize=(12,5))\n",
    "plt.subplot(121)\n",
    "plt.plot(n,accuracy_train,marker='o')\n",
    "plt.title('training accuracy vs n_neighbors')\n",
    "plt.xlabel('n_neighbors')\n",
    "plt.ylabel('accuracy')\n",
    "plt.subplot(122)\n",
    "plt.plot(n,accuracy_test,marker='o')\n",
    "plt.title('testing accuracy vs n_neighbors')\n",
    "plt.xlabel('n_neighbors')\n",
    "plt.ylabel('accuracy')\n",
    "\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "raw",
   "metadata": {},
   "source": [
    "好坏质检分类实战summary：\n",
    "1、通过进行异常检测，帮助找到了潜在的异常数据点；\n",
    "2、通过PCA分析，发现需要保留2维数据集；\n",
    "3、实现了训练数据与测试数据的分离，并计算模型对于测试数据的预测准确率\n",
    "4、计算得到混淆矩阵，实现模型更全面的评估\n",
    "5、通过新的方法，可视化分类的决策边界\n",
    "6、通过调整核心参数n_neighbors值，在计算对应的准确率，可以帮助我们更好的确定使用哪个模型\n",
    "7、核心算法参考链接：https://scikit-learn.org/stable/modules/generated/sklearn.neighbors.KNeighborsClassifier.html#sklearn.neighbors.KNeighborsClassifier"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.10"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
